package compile;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class CommandUtil {
    // 1. 通过Runtime类得到runtime实例，执行exec方法
    // 2. 获取到标准输出，并写入到指定文件中
    // 3. 获取到标准错误，并写入到指定文件中
    // 4. 等待子进程结束，拿到子进程的状态码并返回
    public static int run(String cmd, String stdoutFile, String stderrFile) {
        try {
            // 1. 通过Runtime类得到runtime实例，执行exec方法
            Process process = Runtime.getRuntime().exec(cmd);
            // 2. 获取到标准输出，并写入到指定文件中
            if (stdoutFile != null) { // 注意判空操作
                InputStream stdoutFrom = process.getInputStream();
                FileOutputStream stdoutTo = new FileOutputStream(stdoutFile);
                while (true) {
                    int ch = stdoutFrom.read();
                    if(ch == -1) {
                        break;
                    }
                    stdoutTo.write(ch);
                }
                // 关闭资源
                stdoutFrom.close();
                stdoutTo.close();
            }
            // 3. 获取到标准错误，并写入到指定文件中
            if (stderrFile != null) { // 注意判空操作
                InputStream stderrFrom = process.getErrorStream();
                FileOutputStream stderrTo = new FileOutputStream(stderrFile);
                while (true) {
                    int ch = stderrFrom.read();
                    if(ch == -1) {
                        break;
                    }
                    stderrTo.write(ch);
                }
                // 关闭资源
                stderrFrom.close();
                stderrTo.close();
            }
            // 4. 等待子进程结束，拿到子进程的状态码并返回
            int exitCode = process.waitFor();
            return exitCode;
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
        return 1; // 说明程序运行错误
    }
    // idea默认是utf8编码方式，Windows简体中文系统默认是gbk编码
    // 而linux上编码方式统一是utf8
}
